package net.vkits.common.config;

import net.sf.ehcache.CacheManager;
import net.sf.ehcache.config.CacheConfiguration;
import net.sf.ehcache.config.DiskStoreConfiguration;
import org.apache.shiro.cache.ehcache.EhCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;

import javax.annotation.Resource;

/**
 * Created by ethan-liu on 16/3/14.
 */
@Configuration
public class EhCacheConfig {
    @Resource
    private Environment env;

    @Bean
    public CacheManager ehCacheManager() {
        net.sf.ehcache.config.Configuration config = new net.sf.ehcache.config.Configuration();
        config.updateCheck(false);
        config.diskStore(new DiskStoreConfiguration().path(env.getProperty("Ehcache.diskStorePath")));
        config.setDefaultCacheConfiguration(cacheConfiguration());

        return new CacheManager(config);
    }

    @Bean
    public CacheConfiguration cacheConfiguration() {
        CacheConfiguration cacheConfiguration = new CacheConfiguration();
        //缓存名称
        cacheConfiguration.setName("shiroCache");
        //代替setMaxElementsInMemory，本地缓存最大个数
        cacheConfiguration.setMaxEntriesLocalHeap(env.getProperty("Ehcache.MaxEntriesLocalHeap", int.class, 1000));
        //当内存中对象数量达到maxElementsInMemory时，Ehcache将会对象写到磁盘中
        cacheConfiguration.setOverflowToDisk(env.getProperty("Ehcache.OverflowToDisk", boolean.class, true));
        //硬盘最大缓存个数
        cacheConfiguration.setMaxElementsOnDisk(env.getProperty("Ehcache.MaxElementsOnDisk", int.class, 1000));
        //对象是否永久有效，一但设置了，timeout将不起作用
        cacheConfiguration.setEternal(false);
        //设置对象在失效前的允许闲置时间（单位：秒）。
        //仅当eternal=false对象不是永久有效时使用，可选属性，默认值是0，也就是可闲置时间无穷大
        cacheConfiguration.setTimeToIdleSeconds(env.getProperty("Ehcache.TimeToIdleSeconds", int.class, 120));
        //设置对象在失效前允许存活时间（单位：秒）。最大时间介于创建时间和失效时间之间。
        //仅当eternal=false对象不是永久有效时使用，默认是0.，也就是对象存活时间无穷大
        cacheConfiguration.setTimeToLiveSeconds(env.getProperty("Ehcache.TimeToLiveSeconds", int.class, 120));
        //磁盘失效线程运行时间间隔，默认是120秒
        cacheConfiguration.setDiskExpiryThreadIntervalSeconds(env.getProperty("Ehcache.DiskExpiryThreadIntervalSeconds", int.class, 120));
        //Whether the disk store persists between restarts of the Virtual Machine.
        cacheConfiguration.setDiskPersistent(env.getProperty("Ehcache.DiskPersistent", boolean.class, true));
        //当达到maxElementsInMemory限制时，Ehcache将会根据指定的策略去清理内存。
        //默认策略是LRU（最近最少使用）。你可以设置为FIFO（先进先出）或是LFU（较少使用）
        cacheConfiguration.setMemoryStoreEvictionPolicy(env.getProperty("Ehcache.MemoryStoreEvictionPolicy", "LRU"));
        //内存数量最大时是否清除
        cacheConfiguration.clearOnFlush(env.getProperty("Ehcache.clearOnFlush", boolean.class, true));
        //Sets whether the cache's statistics are enabled. at startup
        cacheConfiguration.setStatistics(env.getProperty("Ehcache.Statistics", boolean.class, true));

        return cacheConfiguration;
    }

    @Bean
    public EhCacheManager shiroEhcacheManager() {
        EhCacheManager cacheManager = new EhCacheManager();
        cacheManager.setCacheManager(ehCacheManager());

        return cacheManager;
    }
}
